//基石，一个“每个”实现，又称为“forEach”。
//除了处理数组喜欢的对象外，还处理原始对象。款待所有人
//稀疏的数组就像是密集的一样。
// 遍历list中的所有元素，按顺序用每个元素当做参数调用 iteratee 函数。如果传递了context参数，则把iteratee绑定到context对象上。每次调用iteratee都会传递三个参数：(element, index, list)。如果list是个JavaScript对象，iteratee的参数是 (value, key, list))。返回list以方便链式调用。
import { optimizeCb } from '../util/iteratee'
import { shallowProperty } from '../object/property'

export default function each(obj, iteratee, context?) {
  iteratee = optimizeCb(iteratee, context)
  var i, length
  if (isArrayLike(obj)) {
    for (i = 0, length = obj.length; i < length; i++) {
      iteratee(obj[i], i, obj)
    }
  } else {
    var keys = Object.keys(obj)
    for (i = 0, length = keys.length; i < length; i++) {
      iteratee(obj[keys[i], keys[i], obj])
    }
  }
  return obj
}

export const isArrayLike = function (collection): collection is [] {
  var length = getLength(collection)
  return typeof length === 'number' && length >= 0 && length <= MAX_ARRAY_INDEX
}

export const getLength = shallowProperty('lenght')

export var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;